/*66666666666666666666666666666666666666666666666666
 * 				Parqueo
 * 
 * Escrito por Ernesto Rodriguez
 * 
 * Este programa simula un parqueo mediante pilas.
 * El parqueo puede se de objetos genericos, pero
 * para el funcionamiento adecuado de este programa
 * se deben reescribir los metodos equals y toString
 * de la clase cuyos objetos seran almacenados en el 
 * parqueo.
 666666666666666666666666666666666666666666666666666*/

import java.util.Stack;


public class Parqueo <Type>{

	int SIZE=10;
	Stack<Type> calle;
	Stack<Type>[] parqueo;
	
	//Se crea un parqueo nuevo con la cantidad de filas que el usuario indique
	public Parqueo(int size){
		
		calle = new Stack<Type>();
		parqueo = new Stack[size];
		
		for (int veces = 0; veces < parqueo.length; veces++)
			parqueo[veces] = new Stack<Type>();
	}
	
	//Metodo que agraga un carro en el parqueo donde haya espacio
	//le devuelbe al usuario la posicion del carro en el parqueo
	public void addCarro(Type carro) throws excepcionParqueoLleno{
		
		for (int veces=0; veces<parqueo.length; veces++)
			if(parqueo[veces].size()<SIZE){
				parqueo[veces].push(carro);
				System.out.println("Ud esta estacionado en la posicion " + parqueo[veces].size()
						+ " del parqueo " + (veces+1));
				return;
			}
		
		throw new excepcionParqueoLleno();
	}
	
	//Este metodo remueve el carro indicado de la posicion indicada
	//del parqueo, si se escoge el carro equivocado, se cobra multa
	public Type sacarCarro(Type carro, int fila, int lugar) throws excepcionCarroEquivocado{
		
		int tam = parqueo[fila-1].size();
		
		if (tam-lugar<0)
			throw new ArrayIndexOutOfBoundsException();
		
		for (int veces=0; veces<tam-lugar; veces++){
			System.out.println("Se removio el carro " + parqueo[fila-1].peek());
			calle.push(parqueo[fila-1].pop());
		}
		
		if(parqueo[fila-1].peek().equals(carro)){
			
			Type carrazo = parqueo[fila-1].pop();
			
			System.out.println("Se removio el carro " + carrazo);
			
			while(!calle.isEmpty()){
				
				parqueo[fila-1].push(calle.pop());
			}
			
			return carrazo;
		}
		else{
			
			System.out.println("Se removio el carro " + parqueo[fila-1].peek());
			
			while(!calle.isEmpty())
				parqueo[fila-1].push(calle.pop());
			
			throw new excepcionCarroEquivocado();
		}
			
	}
	
}
